package com.example.demo.demo.reflect;


/**
 * Class类的使用
 * @author: htc
 * @date: Created in 10:49 2018/3/23.
 */
public class ClassDemo1 {
    public static void main(String[] args) {
        //Foo的实例对象如何表示
        Foo foo1 =  new Foo();
        //Foo这个类 也是一个实例对象， Class类的实例对象

        //任何一个类都是Class的实例对象,这个实例对象有三种表示方式
        //第一种表示方式：实际告诉我们任何一个类都有一个隐含的静态成员变量class
        Class c1 = Foo.class;
        //第二张表示方式：已经知道该类的对象 通过getClass方法
        Class c2 = foo1.getClass();

        /*
         * foo1代表Foo的实例对象 c1 c2代表Class的实例对象
         * 官网声明： c1 c2表示了Foo类的类类型(class type)
         * 类也是对象，是Class类的实例对象
         * 这个对象我们称为该类的类类型
         */
        System.out.println(c1 == c2);

        //第三种表达方式
        Class c3 = null;
        try {
            c3 = Class.forName("com.iresearch.idata.swap.reflect.Foo");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println(c1 == c3);


        //通过该类的类类型创建该对象:即通过c1 c2 c3创建Foo实例
        try {
            Foo foo2 = (Foo) c1.newInstance();
            foo2.print();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

class Foo{
    public void print(){
        System.out.println("foo");
    }
}
